#include <iostream>
#include <future>
#include <thread>

/*
           其实这个函数是对上面的对象的一个整合，async先将可调用对象封装起来，
           然后将其运行结果返回到promise中，这个过程就是一个面向future的一个过程，
           最终通过future.get()来得到结果。
           它的实现方法有两种，一种是std::launch::async，这个是直接创建线程，
           另一种是std::launch::deferred，这个是延迟创建线程(当遇到future.get或者future.wait的时候才会创建线程)，
           这两个参数是std::async的第一个参数，如果没有使用这个两个参数，也就是第一个参数为空的话，
           那么第一个参数默认为std::launch::async | std::launch::deferred，这个就不可控了，
           由操作系统根据当时的运行环境来确定是当前创建线程还是延迟创建线程。
           那么std::async的第二个参数就是可调用对象的名称，第三个参数就是可调用对象的参数。
*/

int fun(int x) {
	x++;
	x *= 10;
	std::cout << std::this_thread::get_id() << std::endl;
	return x;
}


int main()
{
    // std::launch::deferred 当执行到fu.get才开始创建线程
	std::future<int> fu = std::async(std::launch::deferred, fun, 1);
	std::cout << fu.get() << std::endl;
	std::cout << std::this_thread::get_id() << std::endl;
	return 0;
}